package com.apes.fn.trendAnalysis;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.apes.fn.serveControl.serverParentPackage.PControlService;
import com.apes.framework.plugin.esb.api.SimpleRequest;
import com.apes.framework.util.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.Objects;

/**
 * @Title: TrendService
 * @Description: 趋势分析
 * @author: ZhengZeXian
 * @create: 2021/8/17 11:02
 */
@Service("trendAnalysisService")
public class TrendAnalysisService extends PControlService {

    @Autowired
    private TrendAnalysisDao trendAnalysisDao;

    /***
     * 接车数量
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  COMPANY_ID 公司(数组)
     *  AREA_ID 区域(数组)
     *  OPERATION_ID 运营模式(数组)
     *  DATE_START 开始时间 (YYYY-MM)
     *  DATE_END 结束时间
     *
     * 返回值：
     *  CREATE_DATE 日期 （yyyy-mm）
     *  CAR_NUMBER 车流数量
     *  LAST_CAR_NUMBER 上年车流数量
     *  MONTH_RATE 环比
     *  YEAR_RATE 同比
     */
    public JSONArray pickUpCarHistogram(SimpleRequest request){
        JSONObject param = request.getJO();

        checkNull(param,  "DEPT_ID","TYPE","DATE_START", "DATE_END");

        return trendAnalysisDao.queryPickUpCar(param);
    }

    /***
     * 服务业绩总额
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  COMPANY_ID 公司(数组)
     *  AREA_ID 区域(数组)
     *  OPERATION_ID 运营模式(数组)
     *  DATE_START 开始时间 (YYYY-MM)
     *  DATE_END 结束时间
     *
     * 返回值：
     *  CREATE_DATE 日期 （yyyy-mm）
     *  SERVICE_PERFORMANCE_MONEY 服务业绩总额
     *  LAST_SERVICE_PERFORMANCE_MONEY 上年服务业绩总额
     *  MONTH_RATE 环比
     *  YEAR_RATE 同比
     */
    public JSONArray servicePerformanceMoneyHistogram(SimpleRequest request){
        JSONObject param = request.getJO();

        checkNull(param,  "DEPT_ID","TYPE","DATE_START", "DATE_END");

        return trendAnalysisDao.queryServicePerformanceMoney(param);
    }

    /***
     * 营业额
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  COMPANY_ID 公司(数组)
     *  AREA_ID 区域(数组)
     *  OPERATION_ID 运营模式(数组)
     *  DATE_START 开始时间 (YYYY-MM)
     *  DATE_END 结束时间
     *
     * 返回值：
     *  CREATE_DATE 日期 （yyyy-mm）
     *  SALE_MONEY 营业额
     *  LAST_SALE_MONEY 上年营业额
     *  MONTH_RATE 环比
     *  YEAR_RATE 同比
     */
    public JSONArray saleMoneyHistogram(SimpleRequest request){
        JSONObject param = request.getJO();

        checkNull(param,  "DEPT_ID","TYPE","DATE_START", "DATE_END");

        return trendAnalysisDao.querySaleMoney(param);
    }

    /***
     * 客单价
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  COMPANY_ID 公司(数组)
     *  AREA_ID 区域(数组)
     *  OPERATION_ID 运营模式(数组)
     *  DATE_START 开始时间 (YYYY-MM)
     *  DATE_END 结束时间
     *  SIGN ①：不勾选：（总产值-洗车产值）/ 台数-纯洗车台数 ②：勾选：总产值 / 总台数
     *
     * 返回值：
     *  CREATE_DATE 日期 （yyyy-mm）
     *  PRICE 客单价
     *  LAST_PRICE 上年客单价
     *  MONTH_RATE 环比
     *  YEAR_RATE 同比
     */
    public JSONArray guestPriceHistogram(SimpleRequest request){
        JSONObject param = request.getJO();
        if (Objects.isNull(param.get("SIGN"))) param.put("SIGN",false);
        checkNull(param,  "DEPT_ID","SIGN","TYPE","DATE_START", "DATE_END");

        return trendAnalysisDao.queryGuestPrice(param);
    }

    /***
     * 新增客户数量
     * 参数：
     *  DEPT_ID 门店 (数组)
     *  COMPANY_ID 公司(数组)
     *  AREA_ID 区域(数组)
     *  OPERATION_ID 运营模式(数组)
     *  DATE_START 开始时间 (YYYY-MM)
     *  DATE_END 结束时间
     *
     * 返回值：
     *  CREATE_DATE 日期 （yyyy-mm）
     *  NEW_NUMBER 新增的客户数量
     *  LAST_NEW_NUMBER 上年新增的客户数量
     *  MONTH_RATE 环比
     *  YEAR_RATE 同比
     */
    public JSONArray newCustomer(SimpleRequest request){
        JSONObject param = request.getJO();






        return trendAnalysisDao.queryGuestPrice(param);
    }

    /***
     * 用于验证参数不能为空
     */
    private void checkNull(JSONObject param, String... items){
        for (String field : items) {
            if (param.get(field) == null) throw new RuntimeException("参数：" + field + "不能为空");
            if (field.equals("DATE_START") || field.equals("DATE_END")) {
                param.put(field, convertDateToString(param, field));
            }
        }
    }

    /***
     * 转日期为字符串
     * 根据TYPE 类型格式化日期
     */
    private String convertDateToString(JSONObject param, String field){
        Date date = DateUtil.parseUTC(param.getString(field));
        return DateUtil.format(date, typeElectFormat(param.getString("TYPE")));
    }

    /**
     * 根据前端传的类型 取不同的格式化日期
     * @param type
     * @return
     */
    private String typeElectFormat(String type){
        if(type.equals("DAY")){
            return DateUtil.SHOW_DATE_FORMAT;
        } else {
            return DateUtil.SHOW_MONTH_FORMAT;
        }
    }
}
